package main

import (
	"fmt"
	"io/ioutil"
	"path/filepath"
)

func reportPanic() {
	p := recover()
	if p == nil {
		return
	}
	err, ok := p.(error)
	if ok {
		fmt.Println(err)
	} else {
		panic(p)
	}
}

func scanDirectory(path string) {
	fmt.Println("path:", path)
	files, err := ioutil.ReadDir(path)
	if err != nil {
		// 当程序发生panic时，panic输出中包含堆栈跟踪信息，即调用列表
		// 当程序出现panic时,所有的延迟函数调用(defer)依然会执行.如果有多个延迟调用,它们的执行顺序将于被延迟的顺序相反
		panic(err)
	}

	for _, file := range files {
		filePath := filepath.Join(path, file.Name())
		if file.IsDir() {
			scanDirectory(filePath)
		} else {
			fmt.Println(filePath)
		}
	}
}

func main() {
	defer reportPanic()
	scanDirectory("../LearnGo")
}
